package cn.iocoder.yudao.module.system.service.tenant;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.product.TenantProductPageReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.product.TenantProductSaveReqVO;
import cn.iocoder.yudao.module.system.controller.admin.tenant.vo.product.TenantProductSumRespVO;
import cn.iocoder.yudao.module.system.dal.dataobject.tenant.TenantProductDO;

import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 外呼产品 Service 接口
 *
 * @author 数创万维
 */
public interface TenantProductService {

    /**
     * 创建
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createTenantProduct(@Valid TenantProductSaveReqVO createReqVO);

    void updateTenantProduct(TenantProductDO tenantProductDO);

    TenantProductDO getTenantProduct(Long id);

    List<TenantProductDO> getTenantProductList(Set<Long> ids);


    /**
     * 获取可用额度不为0 的集合，因为这个list仅限于更新用， 额度不为0的表示已经用用完了，不需要再更新了
     * @since 2024-04-23
     * @author PetePower
     * @return
     */
    List<TenantProductDO> getTenantProductList();

    /**
     * 获取expire_at 已经超过有效期的列表
     * @since 2024-04-25
     * @author PetePower
     * @return
     */
    List<TenantProductDO> getExpireTenantProductList();


    /**
     * 获得外呼产品分页
     *
     * @param pageReqVO 分页查询
     * @return 外呼产品分页
     */
    PageResult<TenantProductDO> getTenantProductPage(TenantProductPageReqVO pageReqVO);


    /**
     * 根据 企业+code获取剩余额度，应对于企业套餐
     * @param code 套餐code
     * @since 2024-04-24
     * @author PetePower
     * @return 剩余量
     */
    Integer getRemainNumByCode(String code);

    Integer getTotalNumByCode(String code);

    /**
     * 根据租户获取剩余套餐
     *
     * @param ids
     * @return
     */
    Map<Long, List<TenantProductSumRespVO>> getRemainNumMapByTenantId(Collection<Long> ids);

}